Framework to effectively identify blocking queries
I'd suggest looking for long-running sessions, using an XEvents session.  

The problem you're describing sounds like you have client code that is performing row-by-agonizing-row (RBAR) processing instead of using efficient set-based approaches.  

Poorly designed client applications may do something like this:


Connect to SQL Server to get a list of items that need processing.  The query result is held open until all rows have been processed.
perform some long-running process on each row.
Close the query.


What should happen is:


Connect to SQL Server
Run a query, caching the results of the query locally, and closing the connection.
Run the long-running process against each row without keeping the original query open, thereby preventing blocking.


A workaround for SQL Server can be implemented using snapshot isolation row versioning.  See this Technet document for details.  Essentially, row-versioning allows writers to not block readers, vastly reducing blocking.